package singleton.lazy.security.type1;


public class Singleton {

    /**
     * volatile可以让修改值立即更新至主存，可以看成是一个轻量级的synchronized
     */
    private static volatile Singleton instance;

    private Singleton(){
        synchronized (Singleton.class) {
            if (instance != null) {
                throw new RuntimeException("单例对象已经实例化了");
            }
            //将初始化对象赋值给静态变量
            Singleton.instance = this;
        }
    }

    /**
     * 提供一个静态的共有方法，加入两个if语句，双重检查代码，既解决了线程安全问题，又实现了懒汉加载问题
     * 还解决了同步代码块的低效率问题
     * @return
     */
    public static Singleton getInstance() {
        //懒汉加载
        if(instance == null){
            synchronized (Singleton.class){
                //线程安全
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
